package C8_1_SelfEncapsulateField;

/**
 * Desc:&emsp;&ensp;自封装字段<br/>
 * 对象直接访问数据还是访问函数来访问（可以直接访问，需要重构时候重构）
 *
 * 作者推荐先使用直接取值的方式，需要的时候进行重构改为间接访问
 * @author 李渊&emsp;
 * @version 1.0
 * @since V4.3&emsp;2022/7/13
 */
public class C8_1_demo {
    // 基础示例test1-test2
    class test1{
        private int _low, _high;
        // 代码易读
        boolean includes(int arg){
            return arg >= _low && arg <= _high;
        }
    }
    // 重构为下文
    class test2{
        private int _low, _high;
        // 子类可以通过腹泻函数改变取数途径
        int get_low(){
            return  _low;
        }
        int get_high(){
            return  _high;
        }
    }


    // 进阶示例test3-test4
    class test3{
        private int _low, _high;

        boolean includes(int arg){
            return arg >= _low && arg <= _high;
        }

        void grow(int factor){
            _high *= factor;
        }

        test3(int low, int high){
            _low = low;
            _high = high;
        }
    }
    // 重构后
    class test4{
        private int _low, _high;
        // 子类可以通过腹泻函数改变取数途径
        boolean includes(int arg){
            return arg >= get_low() && arg <= get_high();
        }
        void grow(int factor){
            set_high(get_high() * factor);
        }

        // 小心在构造函数中使用setter，一般来说setter需要在对象创建后使用
        // 可以直接使用值或者使用初始化函数
        test4(int low, int high){
            _low = low;
            _high = high;
            // 或者
            // init(low, high)
        }
        private void init(int low, int high){
            _low = low;
            _high = high;
        }

        int get_low(){
            return  _low;
        }
        int get_high(){
            return  _high;
        }

        public void set_low(int _low) {
            this._low = _low;
        }

        public void set_high(int _high) {
            this._high = _high;
        }
    }

    // 重构后对覆写更友好
    class test4_1 extends test4{
        private int _cap;

        test4_1(int low, int high, int cap){
            super(low, high);
            _cap = cap;
        }

        public int get_cap() {
            return _cap;
        }

        // 覆写，但无需修改test4的任何行为
        @Override
        int get_high() {
            return Math.min(super.get_high(), get_cap());
        }
    }

}
